import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2023-01-08
 * Time: 21:35
 */


public class Solution {
    // 前缀和+哈希表
    public int subarraySum(int[] nums, int k) {
        int ans=0;
        // key为前缀和, value 为这个前缀和出现的次数
        Map<Integer, Integer> map=new HashMap<>();
        map.put(0,1);// 为了防止这个值本身就等于 k
        int pre=0;// 前缀和, 只不过进行了优化, 只使用一个变量
        for(int x:nums){
            pre+=x;
            // pre-k, 得到满足条件的前缀和的值
            // 注意下面这两个不能颠倒顺序, 否则对于 k=0 的情况会多出 1
            ans+=map.getOrDefault(pre-k, 0); // 计算满足条件的前缀和的个数
            map.put(pre, map.getOrDefault(pre,0)+1);// 将前缀和放进去
        }
        return ans;
    }
}
